package com.cyj.springaop1.proxy.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @description: 动态代理对象测试
 * @Author C_Y_J
 * @create 2021-03-01 09:42
 **/
public class ProxyJdkTest {
    public static void main(String[] args) {
        TargetInterfaceImpl targetInterface = new TargetInterfaceImpl();
        Advice advice = new Advice();
        /*
         * 在这里需要三个参数
         * Proxy.newProxyInstance 返回就是生产的动态代理对象，
         * */
        TargetInterface proxyInstance = (TargetInterface) Proxy.newProxyInstance(
                //（1）目标对象 类加载器
                targetInterface.getClass().getClassLoader(),
                //（2）目标对象 相同接口 字节码数组
                targetInterface.getClass().getInterfaces(),
                new InvocationHandler() {
                    /*
                     *（3）
                     * 调用动态代理对象的任何方法，实际上调用的是底下的invoke方法
                     * proxy：代理对象
                     * method：目标方法对象
                     * */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //（5）前置增强
                        advice.before();
                        //（4）有人看到这里目标方法调用了invoke方法，会认为是回调！！！
                        // 上面的invoke是动态代理对象的invoke，下面的invoke是反射
                        method.invoke(targetInterface, args);
                        //（6）后置增强
                        advice.afterReturning();
                        return null;
                    }
                }
        );
        //测试
        proxyInstance.save();
    }
}
